package com.atguigu.utils;


import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSONObject;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/*
利用JdbcUtil查询mysql、phoenix其他数据库的信息,并将查询结果转化为想要的任意类型对象，所以List里面放泛型T
phoenix用druid获取连接，查询（具体操作）用jdbc
//DruidPooledConnection phoenixConn = druidDataSource.getConnection();
//PreparedStatement preparedStatement = phoenixConn.prepareStatement(phoenixUpsertSql);
//preparedStatement.execute();
//phoenixConn.commit();//DML(增删改查)需要手动提交连接，DDL(建表)会自动提交

 */
public class JdbcUtil {
    //要将查询的结果转化为一个个T对象（可以是javabean或其他类型）
    public static <T> List<T> queryList(Connection connection,String sql,Class<T> clz) throws SQLException {

        ArrayList<T> list = new ArrayList<>();

        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        ResultSet resultSet = preparedStatement.executeQuery();

        //获取列的个数
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();

        //遍历每行数据，将每行数据结果转化为T对象(取出列名和列值，利用BeanUtils直接转化为T对象)
        while (resultSet.next()){//取出每行数据结果
            //创造T对象
//            T t = clz.newInstance();
                JSONObject jsonObject = new JSONObject();
            //遍历该行数据结果的每一列，将列名和列值取出转化为T对象
            //遍历该行数据结果的每一列，将列名和列值取出放入jsonObject再转化为T对象
            for (int i = 0; i < columnCount; i++) {
                String columnName = metaData.getColumnName(i + 1);//jdbc下标是从1开始
                //取出该行数据结果的列名对应的列值(获取该行第i列的列值)
                Object value = resultSet.getObject(i + 1);
                jsonObject.put(columnName,value);


            }
                //处理列名问题（例如将dim：open方法要从mysql配置表里读数据转化为JavaBean，要把tm_name转化为tmName）
            T t = JSONObject.parseObject(jsonObject.toString(), clz);
            list.add(t);

        }
        resultSet.close();
        preparedStatement.close();
//连接在哪里创建的就在哪里释放，不能在这里释放，否则下一条数据就查不了了

        return list;


    }

    //查询测试
    public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException {
        DruidPooledConnection phoenixConn = DruidDSUtil.getPhoenixConn();
        List<JSONObject> jsonObjects = queryList(phoenixConn, "select * from GMALL220828_REALTIME.DIM_BASE_TRADEMARK", JSONObject.class);
        for (JSONObject jsonObject : jsonObjects) {

            System.out.println(jsonObject);
        }


        phoenixConn.close();
    }
}

